package easyjs

import (
	"context"
	"os"
	"os/exec"
	"slices"
	"time"

	"gitee.com/haodreams/libs/config"
	"gitee.com/haodreams/libs/easy"
	"gitee.com/haodreams/libs/routine"
	"github.com/atotto/clipboard"
	ping "github.com/prometheus-community/pro-bing"
)

type OS struct {
}

// 是否是工作日
func (m *OS) IsWorkday() bool {
	lines, err := easy.ReadLines("data/holiday.csv")
	if err == nil {
		if len(lines) >= 0 {
			now := easy.FormatNow(easy.YMD)
			if slices.Contains(lines, now) {
				return false
			}
		}
	}

	// 获取当前工作日
	day := time.Now().Weekday()
	if day == 0 || day == 6 {
		return false // 示例代码，返回 false 表明是周六或周日，非工作日
	}

	return true // 示例代码，返回 true 表明是工作日
}

// 复制到剪切板
func (m *OS) Copy(text string) {
	clipboard.WriteAll(text)
}

func (m *OS) Ping(host string) int {
	pinger, err := ping.NewPinger(host)
	if err != nil {
		return 0
	}
	pinger.SetPrivileged(true)
	pinger.Count = 1
	pinger.Timeout = time.Second
	err = pinger.Run()
	if err != nil {
		return 0
	}
	stats := pinger.Statistics()
	if stats.PacketsRecv == 0 {
		return 0
	}
	return 1
}

/**
 * @description: 获取配置文件
 * @param {string} key
 * @return {*}
 */
func (m *OS) GetValue(key string) string {
	return config.String(key)
}

// 系统退出函数
func (m *OS) Exit() {
	routine.Stop()
}

func (m *OS) SaveConfig() any {
	return config.Save()
}

// 执行命令
func (m *OS) Exec(cmd ...string) any {
	if len(cmd) == 0 {
		return nil
	}
	command := exec.Command(cmd[0], cmd[1:]...)
	command.Stdout = os.Stdout
	command.Stderr = os.Stderr
	err := command.Run()
	if err != nil {
		return err.Error()
	}
	return nil
}

// 执行命令，并获得输出信息
func (m *OS) ExecWithOutput(cmd ...string) any {
	if len(cmd) == 0 {
		return nil
	}
	command := exec.Command(cmd[0], cmd[1:]...)
	output, err := command.CombinedOutput()
	if err != nil {
		return err
	}
	return string(output)
}

// 执行命令,并设置超时时间
func (m *OS) ExecTimeout(msTimeout int64, cmds ...string) any {
	if len(cmds) == 0 {
		return nil
	}
	if msTimeout == 0 {
		return m.ExecWithOutput(cmds...)
	}
	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(msTimeout)*time.Millisecond)
	defer cancel() // 避免上下文泄漏

	// 创建命令 - 以 ping 为例
	cmd := exec.CommandContext(ctx, cmds[0], cmds[1:]...)

	// 执行命令并获取输出
	output, err := cmd.CombinedOutput()

	// 检查错误类型
	if ctx.Err() == context.DeadlineExceeded {
		return ctx.Err()
	}

	if err != nil {
		return err
	}

	return string(output)
}

func (m *OS) Sleep(ms int) {
	if ms == 0 {
		time.Sleep(time.Millisecond * 1000)
		return
	}
	time.Sleep(time.Millisecond * time.Duration(ms))
}

// 获取一个进程的PID
func (m *OS) Kill(pid int) any {
	process, err := os.FindProcess(int(pid))
	if err != nil {
		return err.Error()
	}
	err = process.Kill()
	if err != nil {
		return err.Error()
	}

	return nil
}
